/*
 * TipoDatoRepresentacionBase.java
 * Copyright 2010 Universidad Francisco de Paula Santander (UFPS).
 * Todos los Derechos Reservados.
 * Creado el 30/11/2010, 11:15:16 AM
 */

package com.ufps.cuatro.util.base;

import java.util.ArrayList;

/**
 * <i><b>TipoDatoRepresentacionBase:</b></i>: Esta Clase es utilizada para representar
 * los Tipos de Datos reconocidos en la aplicación.
 *
 * @author Carlos A. Torres C. - Dolly E. Guerrero. <https://code.google.com/p/tesis4dor/>
 * @version 1.0 30/11/2010
 * @see ObjectBase
 */
public class TipoDatoRepresentacionBase extends ObjectBase{
    private static final long serialVersionUID = -1585327938046442135L;    
    
    /**
     * Indica que el Tipo de Dato puede ser representado por un Modelo Base.
     */
    public final static int COMPATIBILIDAD_MODELOS_BASE = 0;
    /**
     * Indica que el Tipo de Dato puede ser representado por Componentes Personalizados.
     */
    public final static int COMPATIBILIDAD_COMPONENTES_PERSONALIZADOS = 1;
    /**
     * Indica que el Tipo de Dato puede ser representado por un Modelo Base ó
     * Componentes Personalizados.
     */
    public final static int COMPATIBILIDAD_MODELOS_COMPONENTES = 2;
    
    private String strClassPath;
    private boolean primitive;
    private boolean array;
    private int model;
    private String alias;
    private String file;
    private String componentes;
    private String personalizados;
    private int compatibilidad;
    private ModeloRepresentacionBase objModeloBase;
    private boolean collectionObject;   
    private boolean collectionKey;   
    private int idPanelOpciones;
    
    private ArrayList<CastTipoDatoRepresentacionBase> objColeccionCastTipoDatoRepresentacionBase; 

    /**
     * Constructor por Defecto.
     * @param id @DescripcionParametro
     * @param strClassPath @DescripcionParametro
     * @param primitive @DescripcionParametro
     * @param array @DescripcionParametro
     * @param model @DescripcionParametro
     * @param alias @DescripcionParametro
     * @param file @DescripcionParametro
     * @param componentes @DescripcionParametro
     * @param personalizados @DescripcionParametro
     * @param compatibilidad
     * @param collectionObject 
     * @param idPanelOpciones id del Panel de configuracion extra para ciertos Componentes.
     * @DescripcionParametro
     */
    public TipoDatoRepresentacionBase(int id, String strClassPath, boolean primitive, boolean array, int model, String alias, String file, String componentes, String personalizados, int compatibilidad, boolean collectionObject, boolean collectionKey, int idPanelOpciones) {
        super(id);
        this.strClassPath = strClassPath;
        this.primitive = primitive;
        this.array = array;
        this.model = model;
        this.alias = alias;
        this.file = file;
        this.componentes = componentes;
        this.personalizados = personalizados;
        this.compatibilidad = compatibilidad;
        this.collectionObject = collectionObject;
        this.collectionKey = collectionKey;
        this.idPanelOpciones = idPanelOpciones;
        this.objColeccionCastTipoDatoRepresentacionBase = new ArrayList<CastTipoDatoRepresentacionBase>();
    }

    /**
     * Constructor que inicializa el Modelo Soportado.
     * @param id @DescripcionParametro
     * @param strClassPath @DescripcionParametro
     * @param primitive @DescripcionParametro
     * @param array @DescripcionParametro
     * @param model @DescripcionParametro
     * @param alias @DescripcionParametro
     * @param file @DescripcionParametro
     * @param componentes @DescripcionParametro
     * @param personalizados @DescripcionParametro
     * @param compatibilidad  @DescripcionParametro
     * @param collectionObject 
     * @param idPanelOpciones id del Panel de configuracion extra para ciertos Componentes.
     * @param objModeloBase @DescripcionParametro
     */
    public TipoDatoRepresentacionBase(int id, String strClassPath, boolean primitive, boolean array, int model, String alias, String file, String componentes, String personalizados, int compatibilidad, boolean collectionObject, boolean collectionKey, int idPanelOpciones, ModeloRepresentacionBase objModeloBase) {
        super(id);
        this.strClassPath = strClassPath;
        this.primitive = primitive;
        this.array = array;
        this.model = model;
        this.alias = alias;
        this.file = file;
        this.componentes = componentes;
        this.objModeloBase = objModeloBase;
        this.personalizados = personalizados;
        this.compatibilidad = compatibilidad;
        this.collectionObject = collectionObject;
        this.collectionKey = collectionKey;
        this.idPanelOpciones = idPanelOpciones;
        this.objColeccionCastTipoDatoRepresentacionBase = new ArrayList<CastTipoDatoRepresentacionBase>();
    }            

    /**
     * Identifica si el Tipo de Dato es un Array.
     * @return @DefinicionReturn
     */
    public boolean isArray() {
       try{
            return array;
        }catch(java.lang.NullPointerException ex){}
       return false;
    }

    /**
     * Establece si el Tipo de Dato es un Array.
     * @param array @DescripcionParametro
     */
    public void setArray(boolean array) {
        this.array = array;
    }

    /**
     * 
     * @return
     */
    public boolean isCollectionObject() {
        return collectionObject;
    }

    /**
     * 
     * @param collectionObject
     */
    public void setCollectionObject(boolean collectionObject) {
        this.collectionObject = collectionObject;
    }

    public boolean isCollectionKey() {
        return collectionKey;
    }

    public void setCollectionKey(boolean collectionKey) {
        this.collectionKey = collectionKey;
    }
    
    public boolean isCollection() {
        return collectionObject || collectionKey;
    }

    /**
     * Devuelve el Modelo Base que lo Soporta.
     * @return @DefinicionReturn
     */
    public ModeloRepresentacionBase getObjModeloBase() {
        return objModeloBase;
    }

    /**
     * Establece el Modelo Base que lo Soporta.
     * @param objModeloBase @DescripcionParametro
     */
    public void setObjModeloBase(ModeloRepresentacionBase objModeloBase) {
        this.objModeloBase = objModeloBase;
    }

    /**
     * Identifica si el Tipo de Dato es Primitivo.
     * @return @DefinicionReturn
     */
    public boolean isPrimitive() {
        return primitive;
    }

    /**
     * Establece si el Tipo de Dato es Primitivo.
     * @param primitive @DescripcionParametro
     */
    public void setPrimitive(boolean primitive) {
        this.primitive = primitive;
    }

    /**
     * Devuelve el Classapth del Tipo de Dato.
     * @return @DefinicionReturn
     */
    public String getStrClassPath() {
        return strClassPath;
    }

    /**
     * Establece el Classpath del Tipo de Dato.
     * @param strClassPath @DescripcionParametro
     */
    public void setStrClassPath(String strClassPath) {
        this.strClassPath = strClassPath;
    }

    /**
     * Devuelve el Alias del Tipo de Dato.
     * @return @DefinicionReturn
     */
    public String getAlias() {
        return alias;
    }

    /**
     * Establece el Alias para el Tipo de Dato.
     * @param alias @DescripcionParametro
     */
    public void setAlias(String alias) {
        this.alias = alias;
    }

    /**
     * Devuelve la Cadena que Define que Componentes pueden soportar el Tipo de Dato.
     * @return @DefinicionReturn
     */
    public String getComponentes() {
        return componentes;
    }

    /**
     * Establece la Cadena que Define que Componentes pueden soportar el Tipo de Dato.
     * @param componentes @DescripcionParametro
     */
    public void setComponentes(String componentes) {
        this.componentes = componentes;
    }

    /**
     * Devuelve el Archivo de Configuración Soportado.
     * @return @DefinicionReturn
     */
    public String getFile() {
        return file;
    }

    /**
     * Establece el Archivo de Configuración Soportado.
     * @param file @DescripcionParametro
     */
    public void setFile(String file) {
        this.file = file;
    }

    /**
     * Devuelve el Modelo de Representación Soportado.
     * @return @DefinicionReturn
     */
    public int getModel() {
        return model;
    }

    /**
     * Establece el Modelo de representación Soportado.
     * @param model @DescripcionParametro
     */
    public void setModel(int model) {
        this.model = model;
    }

    /**
     * Devuelve la Cadena de Componentes Personalizados Soportados.
     * @return @DefinicionReturn
     */
    public String getPersonalizados() {
        return personalizados;
    }

    /**
     * Establece la Cadena de Componentes Personalizados Soportados.
     * @param personalizados @DescripcionParametro
     */
    public void setPersonalizados(String personalizados) {
        this.personalizados = personalizados;
    }

    /**
     * Devuelve la Compatibilidad del Tipo de Dato con los Componentes de Representación.
     * @return @DefinicionReturn
     */
    public int getCompatibilidad() {
        return compatibilidad;
    }

    /**
     * Establece la Compatibilidad del Tipo de Dato con los Componentes de Representación.
     * @param compatibilidad @DescripcionParametro
     */
    public void setCompatibilidad(int compatibilidad) {
        this.compatibilidad = compatibilidad;
    }    
    
    /**
     * Devuelve el id del Panel de configuracion extra para ciertos Componentes.
     * @return id del Panel de configuracion extra para ciertos Componentes.
     */
    public int getIdPanelOpciones() {
        return idPanelOpciones;
    }

    /**
     * Establece el id del Panel de configuracion extra para ciertos Componentes.
     * @param idPanelOpciones id del Panel de configuracion extra para ciertos Componentes.
     */
    public void setIdPanelOpciones(int idPanelOpciones) {
        this.idPanelOpciones = idPanelOpciones;
    }

    public ArrayList<CastTipoDatoRepresentacionBase> getObjColeccionCastTipoDatoRepresentacionBase() {
        return objColeccionCastTipoDatoRepresentacionBase;
    }

    public void setObjColeccionCastTipoDatoRepresentacionBase(ArrayList<CastTipoDatoRepresentacionBase> objColeccionCastTipoDatoRepresentacionBase) {
        this.objColeccionCastTipoDatoRepresentacionBase = objColeccionCastTipoDatoRepresentacionBase;
    }

    @Override
    public String toString() {
        try{
            return strClassPath + " = " + objModeloBase.toString();
        }catch(java.lang.NullPointerException ex){}
        return "";
    }

    @Override
    public int compareTo(Object o) {
        try{
            TipoDatoRepresentacionBase obj = (TipoDatoRepresentacionBase) o;
            if(this.id > obj.id) {
                return 1;
            }
            else if(this.id < obj.id) {
                return -1;
            }
            else {
                return 0;
            }
        }catch(java.lang.NullPointerException ex){}
        return 0;
    }   

}
